#include "../include/stlcompat/span.h"
#include "../include/stlcompat/print.h"
#include <vector>
#include <array>

int main() {
    // 基础：从 C 数组构造（动态长度）
    int a[6] = {1,2,3,4,5,6};
    kp::span<int> s_dyn(a, 6);
    kp::println("dyn size={} bytes={} first={}", s_dyn.size(), s_dyn.size_bytes(), s_dyn[0]);

    // 静态长度：编译期已知长度，接口与 std::span 保持一致
    kp::span<int, 6> s_st(&a[0]);
    kp::println("st  size={} bytes={} last={}", s_st.size(), s_st.size_bytes(), s_st[5]);

    // 子视图：first/last/subspan（静态 + 动态）
    auto s_first3 = s_dyn.first<3>(); // 静态长度子视图
    kp::println("first3 size={} front={} back={}", s_first3.size(), s_first3.front(), s_first3.back());

    auto s_last2 = s_dyn.last(2); // 动态长度子视图
    kp::println("last2 size={} front={} back={}", s_last2.size(), s_last2.front(), s_last2.back());

    auto s_sub = s_dyn.subspan(2, 3); // [3,4,5]
    kp::println("sub span size={} elems={},{},{}", s_sub.size(), s_sub[0], s_sub[1], s_sub[2]);

    // 与 std::array 互操作
    std::array<int, 4> arr{{10,20,30,40}};
    kp::span<int> s_arr(arr.data(), arr.size());
    kp::println("array view size={} front={} back={} ", s_arr.size(), s_arr.front(), s_arr.back());

    // 与 std::vector 互操作
    std::vector<int> v{7,8,9,10};
    auto s_vec = kp::make_array_view(v);
    kp::println("vector view size={} elems={},{},{},{}", s_vec.size(), s_vec[0], s_vec[1], s_vec[2], s_vec[3]);

    // 迭代器遍历与反向迭代
    int sum = 0;
    for (auto x : s_dyn) sum += x;
    kp::println("sum(dyn)={}", sum);

    kp::print("reverse: ");
    for (auto it = s_dyn.rbegin(); it != s_dyn.rend(); ++it) kp::print("{} ", *it);
    kp::println("");

    // 比较（地址 + 长度）
    kp::span<int> s_same(a, 6);
    kp::println("eq? {} ne? {}", (s_same == s_dyn), (s_same != s_dyn));

    // 重新绑定（动态/静态）
    s_dyn.reinit(a + 1, 3);
    kp::println("reinit dyn size={} elems={},{},{}", s_dyn.size(), s_dyn[0], s_dyn[1], s_dyn[2]);

    kp::span<int, 3> s_stat(&a[0]);
    s_stat.reinit(a + 2);
    kp::println("reinit st  size={} elems={},{},{}", s_stat.size(), s_stat[0], s_stat[1], s_stat[2]);

    return 0;
}
